package com.acmen.easyapi.generator;

import com.acmen.easyapi.annotation.Param;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据获取器工厂
 *
 * @author acmen
 */
@Component
public class DataGeneratorFactory implements ApplicationContextAware {
    List<DataGenerator> dataGenerators = new ArrayList<>();

    /**
     * 根据字段和参数获取数据获取器
     *
     * @param field 字段
     * @param param 参数
     * @return 数据获取器
     */
    public DataGenerator getDataGenerator(Field field, Param param) {
        for (DataGenerator dataGenerator : dataGenerators) {
            // 遍历数据生成器列表
            if (dataGenerator.matches(field, param)) {
                // 如果数据生成器匹配字段和参数
                return dataGenerator;
                // 返回该数据生成器
            }
        }
        return null;
        // 未找到匹配的数据生成器，返回null

    }

    /**
     * 设置Spring应用上下文
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 获取所有类型为 DataGenerator 的 bean
        applicationContext.getBeansOfType(DataGenerator.class).forEach((key, dataGenerator) -> {
            // 将 DataGenerator 添加到 dataGenerators 集合中
            dataGenerators.add(dataGenerator);
        });

    }
}
